package simple_sql

import (
	"database/sql"
	"fmt"
	"strings"
)

// QueryInsert 结构体用于构建和执行INSERT类型的SQL查询。
type QueryInsert struct {
	query     *sql.DB // 数据库连接对象。
	tx        *sql.Tx
	tableName string   // 数据库表名。
	columns   []string // 数据库表中的列名列表。
}

// Values 方法用于执行INSERT操作，插入数据到指定表中。
// 参数values是一个二维切片，每一片代表要插入的一行数据。
// 返回值是最后插入行的ID和可能的错误。
func (q *QueryInsert) Values(values ...[]any) (int64, error) {
	// 检查values参数是否为空，如果为空则返回错误。
	if values == nil {
		return 0, fmt.Errorf("values不能为空")
	}

	// 如果columns为空，则根据values的第一个元素初始化columns。
	if q.columns == nil || len(q.columns) == 0 {
		for _, value := range values[0] {
			q.columns = append(q.columns, value.(string))
		}
		values = values[1:]
	}

	// 构建SQL语句的字符串表示。
	var sqlString strings.Builder
	sqlString.WriteString("INSERT INTO " + q.tableName + " (" + strings.Join(q.columns, ",") + ") VALUES ")

	// 初始化参数列表和值的模板列表。
	var args []any
	var v []string
	for _, value := range values {
		args = append(args, value...)
		v = append(v, "(?"+strings.Repeat(",?", len(value)-1)+")")
	}

	// 将值的模板添加到SQL语句中。
	sqlString.WriteString(strings.Join(v, ","))

	var err error
	var result sql.Result
	// 执行SQL语句。
	if q.tx != nil {
		result, err = q.tx.Exec(sqlString.String(), args...)
	} else {
		result, err = q.query.Exec(sqlString.String(), args...)
	}
	if err != nil {
		return 0, err
	}

	// 返回最后插入行的ID。
	return result.LastInsertId()
}
